// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.utils;

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.eva.android.AppManager;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.alert.AlertDialog;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.logic.main.LoginActivity;

import net.x52im.mobileimsdk.android.utils.MBThreadPoolExecutor;

import java.io.File;
import java.util.Comparator;
import java.util.Date;
import java.util.Locale;

/**
 * 通用工具类。
 *
 * @author JackJiang
 * @since 1.0
 */
public class ToolKits
{
	public final static String TAG = ToolKits.class.getSimpleName();

	/**
	 * 显示提示信息并提供跳转到登陆界面的能力（当前用于被踢或token失效时）。
	 *
	 * @param alertContent 提示信息
	 * @since 10.0
	 */
	public static void showAlertAndGotoLogin(Context c, String alertTitle, String alertContent) {
		// 确保ui显示是在主线程中执行的
		MBThreadPoolExecutor.runOnMainThread(() -> {
			try {
				// 当前正在显示的activity对象
				Activity currentActivty = AppManager.currentActivity();

				// 如果未取到当前正在显示的activity，则通过Applipcation对象显示一个Toast（Applipcation可以显示Toast或不能显示AlertDialog）
				if (currentActivty == null) {
					WidgetUtils.showToast(c, alertContent, WidgetUtils.ToastType.WARN);
					return;
				}

				// 强行设置"自动登陆"为关闭
				PreferencesToolkits.setAutoLogin(c, false);

				// 显示一个被踢提示对话框
				AlertDialog al = new AlertDialog.Builder(currentActivty)
						.setTitle(alertTitle)
						.setMessage(alertContent)
						.setPositiveButton(c.getString(R.string.general_got_it), (dialog, which) -> ToolKits.exitAndGotoLogin(c))
						.show();
				al.setCanceledOnTouchOutside(false);
			} catch (Exception e){
				Log.w(TAG, e);
			}
		});
	}

	/**
	 * 识别系统通知账号。
	 *
	 * @param uid uid号
	 * @return true表示是，否则不是
	 */
	public static boolean isSystemAdmin(String uid){
		return "10000".equals(uid);
	}

	/**
	 * 是否简体中文.
	 *
	 * @return
	 */
	public static boolean isChinese_SimplifiedChinese() {
		String l = Locale.getDefault().getLanguage();
		System.out.println("[DEBUG] 此设备的语言是(getLanguage)："+l);
		// 中文 且 国家是大陆的就表示是简体中文了
		return (l != null && l.equalsIgnoreCase("zh")) // 中文（包括简体中文、繁体中文）
				&& CountryHelper.isChina();// 地区是大陆的
	}

	/**
	 * 退出当前登陆状态并跳转到登际界面（以便重新登陆）。
	 *
	 * @param c 上下文对象
	 */
	public static void exitAndGotoLogin(Context c) {
		// 退出登陆（但不退出JVM——即不通出APP进程）
		// 此通知将在注册与IM服务器的连接、释放IM资源、释放本APP中所有activity后被通知
		LoginActivity.doLogoutNoConfirm(MyApplication.getInstance2(), false, (arg0, arg1) -> {
			// 退出登陆时，取消"自动登陆"的开关量设置
			PreferencesToolkits.setAutoLogin(c, false);

			// 代码执行至此，表示APP中所有的activity都已被回收（包括本MoreAcvitity），而要再次显示登陆界面activity
			// 的话，只能借助APP全局唯一的Context——即Application实例，以下代码千万不可引用错了Context哦
			Context ctx = MyApplication.getInstance2();

			Intent iLogin = IntentFactory.createLoginIntent(ctx);
			// 因Application对象并不是Activity，所以必须要加此flag，否则无法启动Activity
			iLogin.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

			// 进入登陆activity
			ctx.startActivity(iLogin);
		});
	}

	/**
	 * 获取app默认的缓存目录（为了适配Andriod 10、11及以上版本分区存储，本方法返回的是系统允许的app权限内缓存目录）。
	 *
	 * @return 如果成功获取则返回File指明的目录，否则返回nul;
	 * @since 7.2
	 */
	public static File getDefaultCacheDir()
	{
		return getDefaultCacheDir(MyApplication.getInstance2());
	}

	/**
	 * 获取app默认的缓存目录（为了适配Andriod 10、11及以上版本分区存储，本方法返回的是系统允许的app权限内缓存目录）。
	 *
	 * @param context 上下文
	 * @return 如果成功获取则返回File指明的目录，否则返回nul;
	 * @since 7.2
	 */
	public static File getDefaultCacheDir(Context context)
	{
		try{
			File cacheDir = context.getExternalCacheDir();
			if(cacheDir == null){
				cacheDir = context.getCacheDir();
			}
			return cacheDir;
		}
		catch(Exception e) {
			Log.w(TAG, e);
		}
		return null;
	}
				
	/**
	 * 当APP出现致命不可恢复崩溃时（比如实时音视频的底层库因手机兼容性问题
	 * 出现JNI层的fetal错误时），能给于用户友提示，并引用户退出APP(之所以退出
	 * ，是因为此类错误的出现将会因Android的activity单面机制而导致APP处于一种
	 * 脏状态中而无法恢复)。
	 * 
	 * @param context
	 */
	public static void fetalErrorAlert(final Context context)
	{
		MBThreadPoolExecutor.runOnMainThread(() -> {
			try{
				new AlertDialog.Builder(context)
						.setTitle(context.getResources().getString(R.string.general_prompt))
						.setMessage("很遗憾，出现不可恢复故障，请退出APP后再试。")
						.setPositiveButton(context.getResources().getString(R.string.general_ok),  new DialogInterface.OnClickListener(){
							@Override
							public void onClick(DialogInterface dialog,int which) {
								// 做好容错，确保百分百不要导致app再次crash
								try {
									LoginActivity.doLogoutNoConfirm(context, true, null);
								}
								catch (Exception e) {
									Log.e(TAG, e.getMessage(), e);
								}
							}
						})
						.show();
			}
			catch (Exception e){
				Log.w(TAG, e);
			}
		});
	}
	
	
	/**
	 * 对文件类按文件名进行升序排序的比较器.
	 */
	public static class FileNameComparator implements Comparator<File>
	{
		/**
		 * 如果o1小于o2,返回一个负数; 如果o1大于o2，返回一个正数; 如果他们相等，则返回0;
		 */
		@Override
		public int compare(File o1, File o2)
		{
			if (o1 != null && o1.getName() != null && o2 != null && o2.getName() != null)
				return o1.getName().compareToIgnoreCase(o2.getName());
			else
				return 0;
		}
	}

    public static long getTimeStamp()
    {
        return System.currentTimeMillis();
    }
//	public static String getTime()
//	{
//		return new java.text.SimpleDateFormat("HH:mm").format(new Date());
//	}
	
	public static String getDate()
	{
		return new java.text.SimpleDateFormat("yyyy-MM-dd").format(new Date());
	}

	/**
	 * 显示一个图标（成功或失败两种图标）居中显示的自定义Toast。
	 *
	 * @param context 上下文对象
	 * @param showRightOrWrong true表示显示成功图标，否则显示失败图标
	 * @param showString 显示内容
	 * @param toastLength 显示时长，见 {@link Toast#LENGTH_LONG}、{@link Toast#LENGTH_SHORT}
	 */
	public static void showCommonTosat(Context context, boolean showRightOrWrong, String showString, int toastLength)
	{
		// 获取LayoutInflater对象
		LayoutInflater inflater = LayoutInflater.from(context);
		// 父布局View对象
		View layout = inflater.inflate(R.layout.common_toast, null);

		// 文本控件
		TextView text = layout.findViewById(R.id.common_toast_text);
		text.setText(showString);

		// 图标控件
		ImageView icon = layout.findViewById(R.id.common_toast_icon);

		Drawable sexImg;
		int resId = showRightOrWrong ? R.drawable.common_toast_image_right : R.drawable.common_toast_image_wrong;
		sexImg = context.getResources().getDrawable(resId);
//		sexImg.setBounds(0, 0, sexImg.getMinimumWidth(), sexImg.getMinimumHeight());
//		text.setCompoundDrawables(null, sexImg, null, null);
		icon.setImageDrawable(sexImg);

		Toast toast = new Toast(context);
		// 设置Toast的位置
		toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
		toast.setDuration(toastLength);
		// 让Toast显示为我们自定义的样子
		toast.setView(layout);
		toast.show();
	}

	/**
	 * 显示一个图标（成功或失败两种图标）居中显示的自定义Toast。
	 *
	 * @param context 上下文对象
	 * @param showRightOrWrong true表示显示成功图标，否则显示失败图标
	 * @param strResId 显示内容id
	 * @param toastLength 显示时长，见 {@link Toast#LENGTH_LONG}、{@link Toast#LENGTH_SHORT}
	 * @see #showCommonTosat(Context, boolean, String, int)                       
	 */
	public static void showCommonTosat(Context context, boolean showRightOrWrong, int strResId, int toastLength)
	{
		ToolKits.showCommonTosat(context, showRightOrWrong, context.getString(strResId), toastLength);
	}

}
